package com.ftg.rbac.service.impl;

import com.ftg.rbac.dto.UserDto;
import com.ftg.rbac.dto.UserUpdateDto;
import com.ftg.rbac.entity.User;
import com.ftg.rbac.mapper.DeptMapper;
import com.ftg.rbac.mapper.PostMapper;
import com.ftg.rbac.mapper.RoleMapper;
import com.ftg.rbac.mapper.UserMapper;
import com.ftg.rbac.service.IUser;
import com.ftg.rbac.util.BaseResultSet;
import com.ftg.rbac.util.MybatisUtil;
import com.ftg.rbac.util.PageEx;
import com.ftg.rbac.vo.UserListVo;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.binding.MapperRegistry;


import java.util.List;

/**
 * 部门业务处理实现类
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/3/16 上午9:12
 */
public class UserImpl implements IUser {

    private final DeptMapper deptMapper = MybatisUtil.getInstance(DeptMapper.class);
    private final UserMapper userMapper = MybatisUtil.getInstance(UserMapper.class);
    private final PostMapper postMapper = MybatisUtil.getInstance(PostMapper.class);
    private final RoleMapper roleMapper = MybatisUtil.getInstance(RoleMapper.class);

    /**
     * 列表功能
     *
     * @param pageNo  页码
     * @param pageNum 条数
     * @return
     */
    @Override
    public BaseResultSet list(
            String unickname,
            String utel,
            boolean ustate,
            String ucreatedate1,
            String ucreatedate2,
            Integer pageNo, Integer pageNum) {
        BaseResultSet brs = new BaseResultSet();

        PageEx pageEx = new PageEx();
        pageEx.setPageNo(pageNo);
        pageEx.setPageNum(pageNum);

        int reports = userMapper.countUser(unickname,
                utel,
                ustate,
                ucreatedate1,
                ucreatedate2);
        List<UserListVo> list = userMapper.listForAll(unickname,
                utel,
                ustate,
                ucreatedate1,
                ucreatedate2, (pageEx.getPageNo() - 1) * pageEx.getPageNum(), pageEx.getPageNum());

        //其它
        //查数据库查出来的
        pageEx.setReports(reports);
        //查出来的
        pageEx.setRow(list);

        brs.setCode(200);
        if (reports == 0) {
            brs.setMess("操作已成功，数据库里没有数据");
            brs.setData(null);
        } else {
            brs.setMess("操作已成功");
            brs.setData(pageEx);
        }

        return brs;
    }

    @Override
    public BaseResultSet createUser(UserDto userDto){

        // 用户名(帐号)  昵称  密码 不能为空 (不用查)
        // Objects null 不能""
        // StringUtil : spring
        BaseResultSet brs = new BaseResultSet();
        if(StringUtils.isEmpty(userDto.getUname())){
            brs.setCode(10000);
            brs.setMess("账号不能为空");
            return brs;
        }

        if(StringUtils.isEmpty(userDto.getUnickname())){
            brs.setCode(10000);
            brs.setMess("昵称不能为空");
            return brs;
        }

        if(StringUtils.isEmpty(userDto.getUpass())){
            brs.setCode(10000);
            brs.setMess("密码不能为空");
            return brs;
        }
        // 用户名(帐号) 不可重复（查 ）
        if(userMapper.findNumByUname(userDto.getUname()) > 0){
            brs.setCode(10001);
            brs.setMess("账号已存在，请更换");
            return brs;
        }
        // 处理添加的同时，部门有可能删除了 （查一下你给我的部门主键是否存）
        System.out.println(deptMapper);
        System.out.println(userDto);
        if(deptMapper.findNumByDid(userDto.getDid()) <= 0){
            brs.setCode(10002);
            brs.setMess("所选部门不存在，或者已删除");
            return brs;
        }
        // 处理添加的同时，岗位有可能删除了 （查一下你给我的部门主键是否存）
        if(postMapper.findNumByPid(userDto.getPid()) <= 0){
            brs.setCode(10003);
            brs.setMess("所选岗位不存在，或者已删除");
            return brs;
        }
        // 处理添加的同时，角色有可能删除了 （查一下你给我的部门主键是否存）
        if(roleMapper.findNumByRid(userDto.getRid()) <= 0){
            brs.setCode(10005);
            brs.setMess("所选角色不存在，或者已删除");
            return brs;
        }

        try{
            int num = userMapper.saveUser(userDto);
            brs.setCode(num == 1 ? 200 : 500);
            brs.setMess(num == 1 ?"添加操作已成功":"添加失败");
            brs.setData(num);
            MybatisUtil.commitSession();

        }catch(Exception e){
            MybatisUtil.commitRollback();
        }finally {
            MybatisUtil.closeSession();
        }
        return brs;
    }

    @Override
    public BaseResultSet findUserById(Integer uid) {
        User user = userMapper.findOneById(uid);
        BaseResultSet brs = new BaseResultSet();
        brs.setCode(user == null ? 404:200);
        brs.setMess(user == null ? "当前数据已删除":"查询成功");
        brs.setData(user);
        return brs;
    }

    @Override
    public BaseResultSet modifyUserById(UserUpdateDto userUpdateDto){
        BaseResultSet brs = new BaseResultSet();

        if(StringUtils.isEmpty(userUpdateDto.getUnickname())){
            brs.setCode(10000);
            brs.setMess("昵称不能为空");
            return brs;
        }

        // 处理添加的同时，部门有可能删除了 （查一下你给我的部门主键是否存）
        if(deptMapper.findNumByDid(userUpdateDto.getDid()) <= 0){
            brs.setCode(10002);
            brs.setMess("所选部门不存在，或者已删除");
            return brs;
        }
        // 处理添加的同时，岗位有可能删除了 （查一下你给我的部门主键是否存）
        if(postMapper.findNumByPid(userUpdateDto.getPid()) <= 0){
            brs.setCode(10003);
            brs.setMess("所选岗位不存在，或者已删除");
            return brs;
        }
        // 处理添加的同时，角色有可能删除了 （查一下你给我的部门主键是否存）
        if(roleMapper.findNumByRid(userUpdateDto.getRid()) <= 0){
            brs.setCode(10005);
            brs.setMess("所选角色不存在，或者已删除");
            return brs;
        }

        try{
            int num = userMapper.modifyUserById(userUpdateDto);
            brs.setCode(num == 1 ? 200 : 500);
            brs.setMess(num == 1 ?"修改操作已成功":"修改失败");
            brs.setData(num);
            MybatisUtil.commitSession();
        }catch(Exception e){
            MybatisUtil.commitRollback();
        }finally {
            MybatisUtil.closeSession();
        }
        return brs;
    }

    /**
     * 采用高内聚低偶合的方法调用mapper里面的方法
     *
     * @param uid 主键
     * @return BaseResultSet
     */
    @Override
    public BaseResultSet delete(Integer uid) {

        BaseResultSet r = new BaseResultSet();
        assert deptMapper != null;
        assert userMapper != null;
        //2 删除
        try {
            //1 调null
            // 再dml执行之间(锁) dql查询(不会生成事务)

            if (deptMapper.findDeptName(uid) > 0) {
                deptMapper.setNullForDeptName(uid);
            }
            if (userMapper.findOneById(uid) != null) {
                int num = userMapper.deleteUser(uid);
                if (num > 0) {
                    r.setCode(200);
                    r.setData(num);
                    r.setMess("恭喜您 ，删除成功");
                } else if (num == 0) {
                    r.setCode(404);
                    r.setData(num);
                    r.setMess("操作成功，但是数据为里没有影响行数");
                }
            } else {
                r.setCode(404);
                r.setData(0);
                r.setMess("操作成功，但是数据为里没有影响行数");
            }
            MybatisUtil.commitSession();
        } catch (NullPointerException e) {
            r.setCode(500);
            r.setData(0);
            r.setMess("失败，后台产生异常" + e.getMessage());
            MybatisUtil.commitRollback();
        } finally {
            MybatisUtil.closeSession();
        }
        return r;
    }

}
